package Static_Final;/*
 *
 * @author 陈粒
 * @version 创建时间：2021/7/9 14:24
 */

/**
 * 概念：
 * final是java提供的一个关键字
 * final是最终的意思
 * final可以修饰类，方法，变量
 * 特点：
 * 被final修饰的类，不能被继承
 * 被final修饰的方法，不能被重写
 * 被final修饰的变量是个常量，值不能被改变
 * 常量的定义形式：final 数据类型 常量名 = 值
 * final和abstract这两个关键字是反相关的，final类就不可能是abstract的。
 * 特别点一：
 * 用final修饰的成员变量必须被初始化，显示初始化或者通过构造函数初始化
 * 特别点二：
 * final修饰引用类型时，不能再指向其他的对象，但被引用的对象的值是可以改变的
 * （引用变量的值，实际上是它所引用的对象的地址）。
 */
public class Final {
    final int a = 5;//修饰成员变量，变量成为常量，值不发生改变

    void a() {
        final int n = 7;//修饰局部变量，变量成为常量，值不发生改变
    }
}

final class A {//修饰类，不能被继承

    final int b() {//修饰方法，不能被重写
        return 1;
    }
}
//特别点一：使用构造函数给被final修饰的引用类型变量赋值
class B {
    final String s1;

    public B(String s) {//使用构造函数给被final修饰的引用类型变量s赋值
        this.s1 = s;
    }

    public String getS1() {
        return s1;
    }

    public static void main(String[] args) {//main方法在特别点一类里
        //测试特别点一
        B b = new B("final");//给引用类型变量s赋的值
        System.out.println(b.getS1());
        System.out.println("--------------");
        //测试特别点二
        final C c=new C("可可");
        c.name="美美";
 //c=new C("丫丫");这个语句是错误的，引用变量c被final修饰，里面的地址值是固定的，不能再创建对象赋予新的地址值
    }
}
//特别点二：
class C{
    String name;

    public C(String s3) {
        this.name = s3;
    }
}
